#ifndef SWATCHDOG_H
#define SWATCHDOG_H

#include <vector>
#include <ctime>
#include <functional>
#include <thread>
#include <mutex>
#include <atomic>

class swatchdog
{
public:
    using TimeoutCallback = std::function<void()>;

    swatchdog(int timeout_seconds, TimeoutCallback callback)
        : timeout_limit(timeout_seconds), callback(callback), last_reset_time(std::time(nullptr)), running(true) {}

    // 重置看门狗计时器
    void reset();
    // 喂狗，重置计时器防止超时
    void feed();
    // 停止看门狗线程
    void stop();
    // 启动看门狗超时检测的线程
    void start();
    // 等待线程结束
    void join();

private:
    int timeout_limit;                // 超时限制（秒）
    TimeoutCallback callback;         // 超时回调函数
    std::time_t last_reset_time;     // 上次重置的时间
    std::mutex mtx;                  // 保护last_reset_time的互斥锁
    std::thread watch_thread;        // 用于超时检查的线程
    std::atomic<bool> running;       // 用于控制线程是否继续运行

    // 超时检测函数
    void watch();
    // 检查看门狗是否超时
    void check();
};

#endif
